// 一简答题
// 在JS引擎执行一段代码的过程中，主要会经历几个阶段：
// 读取代码=>
// 压入执行栈=>
// 执行栈处理各个任务=>
// 遇到同步任务，处理完，排出执行栈，=>
// 遇到异步任务，执行栈处理完后，会委托宿主环境去执行任务,约定执行后，再将与这个任务的执行结果通过之前约定好的回调函数注册到消息队列=>
// 当执行栈的任务已经执行完成，空闲时=>
// 通过EventLoop会监测到，此时便将消息队列中的任务压入执行栈，逐个执行。

// 宏任务是消息队列里的任务，常见的接口请求、定时器等异步任务都是宏任务。
// 微任务是基于当前任务产生而随当前任务结束后立即执行的任务，所以也是异步任务， 但是不需要通过EventLoop监测，通过消息队列取出并压入执行栈中再执行； 像通过Promise、MutationObserver、process.nextTick产生的任务都为微任务。

//二 异步代码修改
function fn(msg) {
    var promise = new Promise((resolved, rejected) => {
       setTimeout(()=>{
          resolved(msg)
       }, 10)
    });
    return promise;
 }
 
 fn().then(function () {
    return fn("hello")
 }).then(value=> {
    return fn(value+"lagou")
 }).then(value=>{
    return fn(value+"I ♥ U")
 }).then(value=>{
    console.log(value)
 })


//三 
//第一题
const fp = require("lodash/fp")
const cars = [ {name:"mark",home:660,value:20,in_stock:false}, {name:"fut",home:661,value:70,in_stock:false},{name:"Hello World",home:620,value:30,in_stock:true}, {name:"wach",home:30,value:10,in_stock:false}]
const f = fp.flowRight(fp.prop("in_stock"),fp.last)
console.log(f(cars))
//第二题
const f2 = fp.flowRight(fp.prop("name"),fp.first)
console.log(f2(cars))
//第三题

let  _average = function (xs){
    return fp.reduce(fp.add,0,xs) / xs.length
}

let averageDollarValue = function(cars){
   let arr = fp.flowRight(_average,fp.map(car=>car.value))
   return arr(cars)
}
//第四题
let _underscore = fp.replace(/\W+/g,"_") 
function sanitizeNames(){
    return fp.flowRight(fp.map(name=>_underscore(name)))
 }






 